package com.hoe.tsb.fraft.client;

import com.hoe.tsb.block.BlockChainApi;
import com.hoe.tsb.fraft.Node;
import com.hoe.tsb.fraft.event.msg.IFRaftMessage;

/**
 * <p>
 * 客户端和角色之间的桥梁
 * </p>
 *
 * @author hoe
 * @version 1.0
 * @date 2022/12/5
 */
public interface ClientRoleBridge extends BlockChainApi {

    /**
     * 将某个IP:PORT的节点标记为Leader
     * @param ip 待标记节点的IP
     * @param port 待标记节点的端口
     */
    void markLeader(String ip, int port);

    /**
     * 向Leader发送消息
     * @param message 待发送消息
     */
    void sendToLeader(IFRaftMessage message);

    /**
     * 向非Leader，即所有的支持者节点发送消息
     * @param message 待发送消息
     */
    void sendToSupporters(IFRaftMessage message);

    /**
     * 向指定节点发送消息
     * @param message 待发送消息
     * @param ip 节点的IP
     * @param port 节点的端口
     */
    void sendToSpecific(IFRaftMessage message, String ip, int port);

    /**
     * 广播消息，即向所有节点发送消息
     * @param message 待广播消息
     */
    void broadcast(IFRaftMessage message);

    /**
     * 获取Leader节点
     */
    Node getLeader();

    /**
     * 获取FRaft网络中的节点个数
     */
    int getNodeCount();

}
